1   /*
2    * Copyright (c) 2000, 2007, Oracle and/or its affiliates. All rights reserved.
3    * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4    *
5    * This code is free software; you can redistribute it and/or modify it
6    * under the terms of the GNU General Public License version 2 only, as
7    * published by the Free Software Foundation.  Oracle designates this
8    * particular file as subject to the "Classpath" exception as provided
9    * by Oracle in the LICENSE file that accompanied this code.
10   *
11   * This code is distributed in the hope that it will be useful, but WITHOUT
12   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14   * version 2 for more details (a copy is included in the LICENSE file that
15   * accompanied this code).
16   *
17   * You should have received a copy of the GNU General Public License version
18   * 2 along with this work; if not, write to the Free Software Foundation,
19   * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20   *
21   * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22   * or visit www.oracle.com if you need additional information or have any
23   * questions.
24   */
25  
26  package java.awt.image;
27  
28  import static sun.java2d.StateTrackable.State.*;
29  
30  /**
31   * This class extends <code>DataBuffer</code> and stores data internally
32   * in <code>float</code> form.
33   * <p>
34   * <a name="optimizations">
35   * Note that some implementations may function more efficiently
36   * if they can maintain control over how the data for an image is
37   * stored.
38   * For example, optimizations such as caching an image in video
39   * memory require that the implementation track all modifications
40   * to that data.
41   * Other implementations may operate better if they can store the
42   * data in locations other than a Java array.
43   * To maintain optimum compatibility with various optimizations
44   * it is best to avoid constructors and methods which expose the
45   * underlying storage as a Java array as noted below in the
46   * documentation for those methods.
47   * </a>
48   *
49   * @since 1.4
50   */
51  
52  public final class DataBufferFloat extends DataBuffer {
53  
54      /** The array of data banks. */
55      float bankdata[][];
56  
57      /** A reference to the default data bank. */
58      float data[];
59  
60      /**
61       * Constructs a <code>float</code>-based <code>DataBuffer</code>
62       * with a specified size.
63       *
64       * @param size The number of elements in the DataBuffer.
65       */
66      public DataBufferFloat(int size) {
67          super(STABLE, TYPE_FLOAT, size);
68          data = new float[size];
69          bankdata = new float[1][];
70          bankdata[0] = data;
71      }
72  
73      /**
74       * Constructs a <code>float</code>-based <code>DataBuffer</code>
75       * with a specified number of banks, all of which are of a
76       * specified size.
77       *
78       * @param size The number of elements in each bank of the
79       * <code>DataBuffer</code>.
80       * @param numBanks The number of banks in the
81       *        <code>DataBuffer</code>.
82       */
83      public DataBufferFloat(int size, int numBanks) {
84          super(STABLE, TYPE_FLOAT, size, numBanks);
85          bankdata = new float[numBanks][];
86          for (int i= 0; i < numBanks; i++) {
87              bankdata[i] = new float[size];
88          }
89          data = bankdata[0];
90      }
91  
92      /**
93       * Constructs a <code>float</code>-based <code>DataBuffer</code>
94       * with the specified data array.  Only the first
95       * <code>size</code> elements are available for use by this
96       * <code>DataBuffer</code>.  The array must be large enough to
97       * hold <code>size</code> elements.
98       * <p>
99       * Note that {@code DataBuffer} objects created by this constructor
100      * may be incompatible with <a href="#optimizations">performance
101      * optimizations</a> used by some implementations (such as caching
102      * an associated image in video memory).
103      *
104      * @param dataArray An array of <code>float</code>s to be used as the
105      *                  first and only bank of this <code>DataBuffer</code>.
106      * @param size The number of elements of the array to be used.
107      */
108     public DataBufferFloat(float dataArray[], int size) {
109         super(UNTRACKABLE, TYPE_FLOAT, size);
110         data = dataArray;
111         bankdata = new float[1][];
112         bankdata[0] = data;
113     }
114 
115     /**
116      * Constructs a <code>float</code>-based <code>DataBuffer</code>
117      * with the specified data array.  Only the elements between
118      * <code>offset</code> and <code>offset + size - 1</code> are
119      * available for use by this <code>DataBuffer</code>.  The array
120      * must be large enough to hold <code>offset + size</code>
121      * elements.
122      * <p>
123      * Note that {@code DataBuffer} objects created by this constructor
124      * may be incompatible with <a href="#optimizations">performance
125      * optimizations</a> used by some implementations (such as caching
126      * an associated image in video memory).
127      *
128      * @param dataArray An array of <code>float</code>s to be used as the
129      *                  first and only bank of this <code>DataBuffer</code>.
130      * @param size The number of elements of the array to be used.
131      * @param offset The offset of the first element of the array
132      *               that will be used.
133      */
134     public DataBufferFloat(float dataArray[], int size, int offset) {
135         super(UNTRACKABLE, TYPE_FLOAT, size, 1, offset);
136         data = dataArray;
137         bankdata = new float[1][];
138         bankdata[0] = data;
139     }
140 
141     /**
142      * Constructs a <code>float</code>-based <code>DataBuffer</code>
143      * with the specified data arrays.  Only the first
144      * <code>size</code> elements of each array are available for use
145      * by this <code>DataBuffer</code>.  The number of banks will be
146      * equal to <code>dataArray.length</code>.
147      * <p>
148      * Note that {@code DataBuffer} objects created by this constructor
149      * may be incompatible with <a href="#optimizations">performance
150      * optimizations</a> used by some implementations (such as caching
151      * an associated image in video memory).
152      *
153      * @param dataArray An array of arrays of <code>float</code>s to be
154      *                  used as the banks of this <code>DataBuffer</code>.
155      * @param size The number of elements of each array to be used.
156      */
157     public DataBufferFloat(float dataArray[][], int size) {
158         super(UNTRACKABLE, TYPE_FLOAT, size, dataArray.length);
159         bankdata = (float[][]) dataArray.clone();
160         data = bankdata[0];
161     }
162 
163     /**
164      * Constructs a <code>float</code>-based <code>DataBuffer</code>
165      * with the specified data arrays, size, and per-bank offsets.
166      * The number of banks is equal to <code>dataArray.length</code>.
167      * Each array must be at least as large as <code>size</code> plus the
168      * corresponding offset.  There must be an entry in the offsets
169      * array for each data array.
170      * <p>
171      * Note that {@code DataBuffer} objects created by this constructor
172      * may be incompatible with <a href="#optimizations">performance
173      * optimizations</a> used by some implementations (such as caching
174      * an associated image in video memory).
175      *
176      * @param dataArray An array of arrays of <code>float</code>s to be
177      *                  used as the banks of this <code>DataBuffer</code>.
178      * @param size The number of elements of each array to be used.
179      * @param offsets An array of integer offsets, one for each bank.
180      */
181     public DataBufferFloat(float dataArray[][], int size, int offsets[]) {
182         super(UNTRACKABLE, TYPE_FLOAT, size,dataArray.length, offsets);
183         bankdata = (float[][]) dataArray.clone();
184         data = bankdata[0];
185     }
186 
187     /**
188      * Returns the default (first) <code>float</code> data array.
189      * <p>
190      * Note that calling this method may cause this {@code DataBuffer}
191      * object to be incompatible with <a href="#optimizations">performance
192      * optimizations</a> used by some implementations (such as caching
193      * an associated image in video memory).
194      *
195      * @return the first float data array.
196      */
197     public float[] getData() {
198         theTrackable.setUntrackable();
199         return data;
200     }
201 
202     /**
203      * Returns the data array for the specified bank.
204      * <p>
205      * Note that calling this method may cause this {@code DataBuffer}
206      * object to be incompatible with <a href="#optimizations">performance
207      * optimizations</a> used by some implementations (such as caching
208      * an associated image in video memory).
209      *
210      * @param bank the data array
211      * @return the data array specified by <code>bank</code>.
212      */
213     public float[] getData(int bank) {
214         theTrackable.setUntrackable();
215         return bankdata[bank];
216     }
217 
218     /**
219      * Returns the data array for all banks.
220      * <p>
221      * Note that calling this method may cause this {@code DataBuffer}
222      * object to be incompatible with <a href="#optimizations">performance
223      * optimizations</a> used by some implementations (such as caching
224      * an associated image in video memory).
225      *
226      * @return all data arrays for this data buffer.
227      */
228     public float[][] getBankData() {
229         theTrackable.setUntrackable();
230         return (float[][]) bankdata.clone();
231     }
232 
233     /**
234      * Returns the requested data array element from the first
235      * (default) bank as an <code>int</code>.
236      *
237      * @param i The desired data array element.
238      *
239      * @return The data entry as an <code>int</code>.
240      * @see #setElem(int, int)
241      * @see #setElem(int, int, int)
242      */
243     public int getElem(int i) {
244         return (int)(data[i+offset]);
245     }
246 
247     /**
248      * Returns the requested data array element from the specified
249      * bank as an <code>int</code>.
250      *
251      * @param bank The bank number.
252      * @param i The desired data array element.
253      *
254      * @return The data entry as an <code>int</code>.
255      * @see #setElem(int, int)
256      * @see #setElem(int, int, int)
257      */
258     public int getElem(int bank, int i) {
259         return (int)(bankdata[bank][i+offsets[bank]]);
260     }
261 
262     /**
263      * Sets the requested data array element in the first (default)
264      * bank to the given <code>int</code>.
265      *
266      * @param i The desired data array element.
267      * @param val The value to be set.
268      * @see #getElem(int)
269      * @see #getElem(int, int)
270      */
271     public void setElem(int i, int val) {
272         data[i+offset] = (float)val;
273         theTrackable.markDirty();
274     }
275 
276     /**
277      * Sets the requested data array element in the specified bank to
278      * the given <code>int</code>.
279      *
280      * @param bank The bank number.
281      * @param i The desired data array element.
282      * @param val The value to be set.
283      * @see #getElem(int)
284      * @see #getElem(int, int)
285      */
286     public void setElem(int bank, int i, int val) {
287         bankdata[bank][i+offsets[bank]] = (float)val;
288         theTrackable.markDirty();
289     }
290 
291     /**
292      * Returns the requested data array element from the first
293      * (default) bank as a <code>float</code>.
294      *
295      * @param i The desired data array element.
296      *
297      * @return The data entry as a <code>float</code>.
298      * @see #setElemFloat(int, float)
299      * @see #setElemFloat(int, int, float)
300      */
301     public float getElemFloat(int i) {
302         return data[i+offset];
303     }
304 
305     /**
306      * Returns the requested data array element from the specified
307      * bank as a <code>float</code>.
308      *
309      * @param bank The bank number.
310      * @param i The desired data array element.
311      *
312      * @return The data entry as a <code>float</code>.
313      * @see #setElemFloat(int, float)
314      * @see #setElemFloat(int, int, float)
315      */
316     public float getElemFloat(int bank, int i) {
317         return bankdata[bank][i+offsets[bank]];
318     }
319 
320     /**
321      * Sets the requested data array element in the first (default)
322      * bank to the given <code>float</code>.
323      *
324      * @param i The desired data array element.
325      * @param val The value to be set.
326      * @see #getElemFloat(int)
327      * @see #getElemFloat(int, int)
328      */
329     public void setElemFloat(int i, float val) {
330         data[i+offset] = val;
331         theTrackable.markDirty();
332     }
333 
334     /**
335      * Sets the requested data array element in the specified bank to
336      * the given <code>float</code>.
337      *
338      * @param bank The bank number.
339      * @param i The desired data array element.
340      * @param val The value to be set.
341      * @see #getElemFloat(int)
342      * @see #getElemFloat(int, int)
343      */
344     public void setElemFloat(int bank, int i, float val) {
345         bankdata[bank][i+offsets[bank]] = val;
346         theTrackable.markDirty();
347     }
348 
349     /**
350      * Returns the requested data array element from the first
351      * (default) bank as a <code>double</code>.
352      *
353      * @param i The desired data array element.
354      *
355      * @return The data entry as a <code>double</code>.
356      * @see #setElemDouble(int, double)
357      * @see #setElemDouble(int, int, double)
358      */
359     public double getElemDouble(int i) {
360         return (double)data[i+offset];
361     }
362 
363     /**
364      * Returns the requested data array element from the specified
365      * bank as a <code>double</code>.
366      *
367      * @param bank The bank number.
368      * @param i The desired data array element.
369      *
370      * @return The data entry as a <code>double</code>.
371      * @see #setElemDouble(int, double)
372      * @see #setElemDouble(int, int, double)
373      */
374     public double getElemDouble(int bank, int i) {
375         return (double)bankdata[bank][i+offsets[bank]];
376     }
377 
378     /**
379      * Sets the requested data array element in the first (default)
380      * bank to the given <code>double</code>.
381      *
382      * @param i The desired data array element.
383      * @param val The value to be set.
384      * @see #getElemDouble(int)
385      * @see #getElemDouble(int, int)
386      */
387     public void setElemDouble(int i, double val) {
388         data[i+offset] = (float)val;
389         theTrackable.markDirty();
390     }
391 
392     /**
393      * Sets the requested data array element in the specified bank to
394      * the given <code>double</code>.
395      *
396      * @param bank The bank number.
397      * @param i The desired data array element.
398      * @param val The value to be set.
399      * @see #getElemDouble(int)
400      * @see #getElemDouble(int, int)
401      */
402     public void setElemDouble(int bank, int i, double val) {
403         bankdata[bank][i+offsets[bank]] = (float)val;
404         theTrackable.markDirty();
405     }
406 }